import Food from "./food";
import ScorePanel from "./scorePanel";
import Snake from "./snake";

export default class GameControl {
  // 实例化类
  food: Food; // 食物
  scorePanel: ScorePanel; // 计分板
  snake: Snake; // 蛇

  //  创建一个属性来存储蛇的移动方向、即按键的方向
  direction: string = ""
  //  记录游戏是否结束
  isLive: boolean = true
  constructor() {
    this.food = new Food();
    this.scorePanel = new ScorePanel(10, 2);
    this.snake = new Snake();
    this.init()
  }
  // 游戏初始化方法、调用则游戏直接开始
  init(): void {
    // 绑定键盘事件
    document.addEventListener("keydown", this.keydownHandler.bind(this))
    //  调用run 使蛇动
    this.run()
  }
  //  创建键盘按下的响应函数
  keydownHandler(event: KeyboardEvent) {
    // ArrowUp
    // ArrowRight
    // ArrowDown
    // ArrowLeft
    console.log(event.key);
    // direction 方向
    // console.log(this);
    //  检查按键是否合法

    this.direction = event.key // 注意这里的this是document因此回调函数里面需要用bind


  }
  //  控制蛇移动的方法
  run() {
    //  根据方向 this.direction 来设置蛇位置的变化
    //  向上 向下修改top指  向左向右修改left
    let X = this.snake.getX()
    let Y = this.snake.gety()
    this.checkEat(X, Y)

    switch (this.direction) {
      case 'ArrowUp':
        Y -= 10
        break;
      case 'ArrowRight':
        X += 10
        break;
      case 'ArrowDown':
        Y += 10
        break;
      case 'ArrowLeft':
        X -= 10

        break;
      default:
        break;
    }

    try {
      this.snake.setX(X)
      this.snake.setY(Y)
    } catch (error) {
      //  出现异常
      alert(error)
      this.isLive = false
    }

    this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30)
  }

  //  检查蛇是否吃到食物
  checkEat(x: number, y: number) {
    if (x == this.food.getX() && y === this.food.getY()) {
      // console.log("吃到食物了");
      this.food.change() // 改变食物位置
      this.scorePanel.addScore() // 分数增加
      this.snake.addBody()
    }

  }
}
